//package com.hfzy.ihk.common.core;
//
//import com.baomidou.mybatisplus.core.MybatisConfiguration;
//import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
//import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
//import org.apache.ibatis.session.ExecutorType;
//import org.apache.ibatis.session.LocalCacheScope;
//import org.apache.ibatis.session.SqlSessionFactory;
//import org.apache.ibatis.type.JdbcType;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Import;
//import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
//import org.springframework.core.io.support.ResourcePatternResolver;
//
//import javax.sql.DataSource;
//
///**
// * Created by Administrator on 2017/12/23.
// *
// * @author wws
// */
////@Configuration
////@EnableTransactionManagement
//@Import(DruidConfig.class)
////com.hfzy.ihk.customer.dao,com.hfzy.ihk.security.dao,com.hfzy.ihk.common.dao
////@MapperScan("com.hfzy.ihk.*.dao")
//public abstract class AbstractMybatisConfig {
//
//
//	@Bean
//	public LogicSqlInjector logicSqlInjector(){
//        	return new LogicSqlInjector();
//		}
////	<!--mybatisPlus 全局配置 :
////    注：
////    表名，字段名都要遵守驼峰命名规则
////	-->
//
//	@Bean
//	public GlobalConfiguration globalConfiguration(LogicSqlInjector logicSqlInjector){
//		GlobalConfiguration globalConfiguration = new GlobalConfiguration();
//	//    AUTO->`0`("数据库ID自增")
//	//    INPUT->`1`(用户输入ID")
//	//    ID_WORKER->`2`("全局唯一ID")
//	//    UUID->`3`("全局唯一ID")
//		globalConfiguration.setIdType(0);
//	//    MYSQL->`mysql`
//	//    ORACLE->`oracle`
//	//    DB2->`db2`
//	//    H2->`h2`
//	//    HSQL->`hsql`
//	//    SQLITE->`sqlite`
//	//    POSTGRE->`postgresql`
//	//    SQLSERVER2005->`sqlserver2005`
//	//    SQLSERVER->`sqlserver`
//		globalConfiguration.setDbType("mysql");
////		<!-- # 表名、字段名、是否使用下划线命名（默认 false）-->
//		globalConfiguration.setDbColumnUnderline(true);
////    	<!--#数据库大写下划线转换-->
//		globalConfiguration.setCapitalMode(false);
////		<!--#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"-->
//		globalConfiguration.setFieldStrategy(2);
////    	<!--#刷新mapper 调试神器-->
//		globalConfiguration.setRefresh(true);
////		<!-- 逻辑删除 定义下面3个参数-->
//		globalConfiguration.setSqlInjector(logicSqlInjector);
//		globalConfiguration.setLogicDeleteValue("-1");
//		globalConfiguration.setLogicNotDeleteValue("1");
//		return globalConfiguration;
//	}
//
//	@Bean
////	<!--相当于settings-->
//	public MybatisConfiguration mybatisConfiguration() {
//
//		MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
//		//下划线转驼峰
//		mybatisConfiguration.setMapUnderscoreToCamelCase(true);
////		<!-- 部分数据库不识别默认的NULL类型（比如oracle，需要配置该属性 -->
//		mybatisConfiguration.setJdbcTypeForNull(JdbcType.NULL);
////		<!--二级缓存是否开启-->
//		mybatisConfiguration.setCacheEnabled(false);
////		<!--全局启用或禁用延迟加载。当禁用时, 所有关联对象都会即时加载-- >
//		mybatisConfiguration.setLazyLoadingEnabled(true);
////		<!--允许或不允许多种结果集从一个单独 的语句中返回(需要适合的驱动)-- >
//		mybatisConfiguration.setMultipleResultSetsEnabled(true);
////		<!--使用列标签代替列名。不同的驱动在这 方便表现不同。参考驱动文档或充分测 试两种方法来决定所使用的驱动 -- >
//		mybatisConfiguration.setUseColumnLabel(true);
////		<!--允许 JDBC 支持生成的键。需要适合的 驱动。如果设置为 true 则这个设置强制 生成的键被使用, 尽管一些驱动拒绝兼 容但仍然有效(比如Derby)-- >
//		mybatisConfiguration.setUseGeneratedKeys(false);
////		<!--配置默认的执行器。SIMPLE 执行器没 有什么特别之处。REUSE 执行器重用 预处理语句。BATCH 执行器重用语句 和批量更新-- >
//		mybatisConfiguration.setDefaultExecutorType(ExecutorType.SIMPLE);
////		<!--设置超时时间, 它决定驱动等待一个数 据库响应的时间-- >
//		mybatisConfiguration.setDefaultStatementTimeout(300);
//		mybatisConfiguration.setSafeRowBoundsEnabled(false);
//		mybatisConfiguration.setLocalCacheScope(LocalCacheScope.SESSION);
//
//		/*默认类型转换器*/
//		mybatisConfiguration.getTypeHandlerRegistry().register("com.hfzy.ihk.common.core.mybatis.typeHandler");
//
//		return mybatisConfiguration;
//	}
//
//	//		mybatisConfiguration.getTypeHandlerRegistry().register(KeyValueField.class, JdbcType.VARCHAR,KeyValueTypeHandler.class);
////		mybatisConfiguration.getTypeHandlerRegistry().register(KeyValueField.class, JdbcType.CHAR,KeyValueTypeHandler.class);
////		mybatisConfiguration.getTypeHandlerRegistry().register(KeyValueField[].class, JdbcType.VARCHAR,KeyValueTypeArrayHandler.class);
////		mybatisConfiguration.getTypeHandlerRegistry().register(KeyValueField[].class, JdbcType.CHAR,KeyValueTypeArrayHandler.class);
//	protected abstract void registryTypeHandler(MybatisConfiguration mybatisConfiguration);
//
//	//	<!--
////            | 分页插件配置
////    | 插件提供二种方言选择：1、默认方言 2、自定义方言实现类，两者均未配置则抛出异常！
////            | overflowCurrent 溢出总页数，设置第一页 默认false
////    | optimizeType Count优化方式 （ 版本 2.0.9 改为使用 jsqlparser 不需要配置 ）
////            | -->
////	<!-- 注意!! 如果要支持二级缓存分页使用类 CachePaginationInterceptor 默认、建议如下！！
//// 		<property name="sqlParser" ref="自定义解析类、可以没有" />
////        <property name="localPage" value="默认 false 改为 true 开启了 pageHeper 支持、可以没有" />
////        <property name="dialectClazz" value="自定义方言类、可以没有" />
////            -->
////	<!--mybatisPlus 将数据源映射到sqlSessionFactory中 -->
//	/*
//	*
//	mapperLocations：它表示我们的Mapper文件存放的位置，当我们的Mapper文件跟对应的Mapper接口处于同一位置的时候可以不用指定该属性的值。
//	configLocation：用于指定Mybatis的配置文件位置。如果指定了该属性，那么会以该配置文件的内容作为配置信息构建对应的SqlSessionFactoryBuilder，
//	但是后续属性指定的内容会覆盖该配置文件里面指定的对应内容。
// 	typeAliasesPackage：它一般对应我们的实体类所在的包，这个时候会自动取对应包中不包括包名的简单类名作为包括包名的别名。
// 	多个package之间可以用逗号或者分号等来进行分隔。(value的值一定要是包的全名)
// 	typeAliases：数组类型，用来指定别名的。指定了这个属性后，Mybatis会把这个类型的短名称作为这个类型的别名，
// 	前提是该类上没有标注@Alias注解，否则将使用该注解对应的值作为此种类型的别名。(value的值一定要是类的完全限定名)
//	* */
//	@Bean("mybatisSqlSession")
//	public SqlSessionFactory sqlSessionFactory(DataSource dataSource,
//											   GlobalConfiguration globalConfiguration,
//											   MybatisConfiguration mybatisConfiguration) throws Exception {
//
//		MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
//		sqlSessionFactoryBean.setDataSource(dataSource);
//		sqlSessionFactoryBean.setGlobalConfig(globalConfiguration);
//
//		//实体类目录
////		String typeAliasesPackage = "com.hfzy.ihk.security.entity,com.hfzy.ihk.facade.entity,com.hfzy.ihk.common.entity";
//		String typeAliasesPackage = configTypeAliasesPackage();
//		//自定义枚举转换,
////		String typeEnumsPackage = "com.hfzy.ihk.common.enums,com.hfzy.ihk.facade.enums,com.hfzy.ihk.security.enums";
//		String typeEnumsPackage = configEnumsPackage();
//		//配置文件
////		String mapperLocations = "classpath:mybatis/mapper/*Mapper.xml";
//		String mapperLocations = configMapperLocations();
//
//		ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//		sqlSessionFactoryBean.setMapperLocations(resolver.getResources(mapperLocations));
//		sqlSessionFactoryBean.setTypeEnumsPackage(typeEnumsPackage);
//		sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasesPackage);
//
//		sqlSessionFactoryBean.setConfiguration(mybatisConfiguration);
//
//		/*sqlSessionFactoryBean.setPlugins(new Interceptor[]{
//				new PaginationInterceptor(),
//				new PerformanceInterceptor(),
//				new OptimisticLockerInterceptor()
//		});*/
//		configPlugins(sqlSessionFactoryBean);
//
//		SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
//
//		return sqlSessionFactory;
//	}
//
//	/**
//	 * 实体类目录配置
//	 * */
//	protected abstract String configTypeAliasesPackage();
//	/**
//	 * 自定义枚举目录配置
//	 * */
//	protected abstract String configEnumsPackage();
//	/**
//	 * mapper.xml配置
//	 * */
//	protected abstract String configMapperLocations();
//
//	/**
//	 * 插件配置
//	 * */
//	protected abstract void configPlugins(MybatisSqlSessionFactoryBean sqlSessionFactoryBean);
//}
